import { createUrl, getRouteWithOption } from "@/lib/tool";
import { emitter } from "@/lib";

let navigateLock = false

/**页面hook */
export const usePage = () => {

	/**
	 * 保留当前页面，跳转到应用内的某个页面
	 * @param url 需要跳转的应用内非 tabBar 的页面的路径
	 * @param params 参数
	 * @example navigate('/pages/index')
	 */
	const navigate = (url: string, params?: Record<string, unknown>) => {
		if (navigateLock) return
		navigateLock = true
		if (params && typeof params === 'object' && Object.keys(params).length) url = createUrl(url, params)
		uni.navigateTo({
			url: url,
			complete() {
				navigateLock = false
			},
		})
	}
	/**
	 * 关闭当前页面，跳转到应用内的某个页面。
	 * @param url 
	 * @param params 
	 */
	const redirect = (url: string, params?: Record<string, unknown>) => {
		if (params && typeof params === 'object' && Object.keys(params).length) url = createUrl(url, params)
		uni.redirectTo({ url })
	}
	/**
	 * 关闭所有页面，打开到应用内的某个页面。
	 * @param url 
	 * @param params 
	 */
	const reLaunch = (url: string, params?: Record<string, unknown>) => {
		if (params && typeof params === 'object' && Object.keys(params).length) url = createUrl(url, params)
		uni.reLaunch({ url })
	}

	/**
	 * 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面。
	 * @param url 
	 * @param params 
	 */
	const switchTab = (url: string, params?: Record<string, unknown>) => {
		if (params && typeof params === 'object' && Object.keys(params).length) url = createUrl(url, params)
		uni.switchTab({ url })
	}
	/**
	 * 关闭当前页面，返回上一页面或多级页面
	 * @param delta 返回级数
	 */
	const back = (delta: number = 1, success?: (result: unknown) => void) => {
		uni.navigateBack({
			delta,
			success,
		})
	}

	/**
	 * 刷新当前页
	 */
	const reload = () => {
		const url = getRouteWithOption()
		redirect(url)
	}

	/**设置页面标题 */
	const setNavBarTitle = (title: string) => {
		uni.setNavigationBarTitle({ title })
	}

	/**
	 * 注册事件
	 * @param eventName 事件名
	 * @param callback 回调
	 * @description 在需要接受页面传递的数据是使用
	 */
	const on = emitter.on

	/**
	 * 触发事件
	 * @param eventName 事件名
	 * @param data 
	 * @description 在页面需要向页面传递数据时使用
	 */
	const send = emitter.emit
	return {
		navigate,
		redirect,
		reLaunch,
		switchTab,
		back,
		reload,
		setNavBarTitle,
		on,
		send,
	}
}